#pragma once
namespace my {
	template<class Iterator, class Ref, class Ptr>
	struct ReverseIterator {
		typedef ReverseIterator<Iterator, Ref, Ptr> Self;
		Iterator _it;

		ReverseIterator(Iterator it)
			:_it(it)
		{
		}

		ReverseIterator(const Self& it)
			:_it(it._it)
		{
		}

		Ref operator*() {
			return *_it;
		}

		Ptr operator->() {
			return &(operator*());
		}

		Self& operator++() {
			--_it;
			return *this;
		}

		Self operator++(int) {
			Self tmp(*this);
			--_it;
			return tmp;
		}

		Self& operator--() {
			++_it;
			return *this;
		}

		Self operator--(int) {
			Self tmp(*this);
			++_it;
			return tmp;
		}

		bool operator!=(const Self& it) const {
			return _it != it._it;
		}

		bool operator==(const Self& it) const {
			return _it == it._it;
		}
	};
}